/*
 * @Author: 杨超
 * @Date: 2021-11-24 20:33:45
 * @LastEditTime: 2021-12-03 15:58:35
 * @LastEditors: 杨超
 * @Description:
 */
/**
 * Created by 王冬 on 2021/6/10.
 * QQ: 20004604
 * weChat: qq20004604
 * 功能说明：
 * 公共表单组件
 */
// import { TypesModel } from '@/models'
const superType = data => {
    const type = Object.prototype.toString.call(data).toLowerCase()
    return type.replace(/^\[object\s(\w+)\]$/, (...rest) => {
        return rest[1]
    })
}

export default {
    props: {
        // 全部表单元素禁用。通常用于提交时使用
        allDisabled: {
            type: Boolean,
            default: false
        },
        // 是否给表单显示border 外框，包含区块外侧有一个 boder，以及区块标题的灰色背景
        borderForm: {
            type: Boolean,
            default: true
        },
        // 文字模式。不显示表单组件，而是只显示纯文字内容
        // 同时，纯文本模式（即值为 true 的时候），会隐藏表单要素 label 左边的星号
        textModel: {
            type: Boolean,
            default: false
        },
        // 自定义表单每个要素的列。
        // 如果是 6 则为 一行 4 列，12 则为 1 行 2 列。
        // 优先级高于表单要素本身的设置
        // 如果为 0，则使用表单要素本身的设置
        formItemCol: {
            type: [Number, String],
            default: 0
        },
        // 左右模式或者上下模式。top 为上下，left/right 为左右（指左右时，label 是左对齐或右对齐）
        labelPosition: {
            type: String,
            default: 'top'
        },
        // 左右模式时，label 的宽度
        labelWidth: {
            type: String,
            default: '160px'
        },
        dynamicSelectOption: {
            type: Object,
            default: () => ({
                // model: new TypesModel(), // 获取字典列表model
                // apiName: 'loadType', // 获取字典下拉方法
                // value: 'value', // 这是下拉框选项的值
                // label: 'label'
            })
        }
    },
    methods: {
        // 获取区块的样式
        getBlockClass(blockItem) {
            const c = blockItem.class
            return Object.assign({}, c, {
                'block-item': this.borderForm,
                'block-hide': this.foldBlockList.indexOf(blockItem.label) > -1
            })
        },

        // 获取 label
        getFormItemLabel(formItem) {
            if (!formItem.label) {
                return ''
            }
            // if (this.textModel && (this.labelPosition === 'left' || this.labelPosition === 'right')) {
            //     return formItem.label + '：'
            // }
            return formItem.label
        },

        // 获取单个要素的列宽
        getColSize(item) {
            if (item.type === 'child-form' || item.type === 'slot-single' || item.type === 'table-readonly') {
                return 24
            }

            // 要素为其他类型时，优先全局 size，再次是要素本身 size，再次是默认值 8，三分之一
            return item.span || this.formItemCol || item.size || 8
        },
        deepCopy(origin) {
            const valueTypes = ['object', 'array'] // 后面可以支持下 map、set 等
            if (!valueTypes.includes(superType(origin))) {
                return '必须传入对象' // 若不是对象则结束
            }
            const target = Array.isArray(origin) ? [] : {} // 判别是数组还是对象
            for (const k in origin) {
                // 循环拷贝
                if (Object.prototype.hasOwnProperty.call(origin, k)) {
                    // 判断属性是否在对象自身上（非原型链上的父级属性）
                    if (valueTypes.includes(superType(origin[k]))) {
                        // 复杂类型，递归
                        target[k] = this.deepCopy(origin[k])
                    } else {
                        target[k] = origin[k]
                    }
                }
            }
            return target
        }
    }
}
